package com.powernode.ssm.springAnalysis.a12;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.util.Arrays;

public class CglibProxyDemo {

    //注意类不能加final，因为代理类需要是目标类的子类
    static class Target {
        //同理foo方法也不能加final，因为代理类需要重写该方法
        public void foo() {
            System.out.println("target foo");
        }
    }

    // 代理是子类型, 目标是父类型
    public static void main(String[] param) {
        //Target target = new Target();
        Target proxy = (Target) Enhancer.create(Target.class, new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("组装前运行...");
//                Object invoke = method.invoke(target, objects);//需要传入被代理对象，用反射调用目标
//                Object invoke = methodProxy.invoke(target, objects);//需要传入被代理对象，内部没有用到反射（spring）
                Object invoke = methodProxy.invokeSuper(o, objects);//不需要传入被代理对象，而是传代理对象，内部没有用到反射
                System.out.println("组装后运行...");
                return invoke;
            }
        });
        proxy.foo();
    }
}